#include_function".\src\lib_Marisa.txt"

//0.275
//15
//8,10
//6
let DMG_MAINSHOT=4.125;
let DMG_SUBSHOT1=[2.2,2.75];
let DMG_SUBSHOT2=1.65;



sub onInitialize_MarisaC{
	onInitialize_Marisa;
	LoadPlayerShotData(csd~"src\data_playershot_mc.txt");
}



task Main{
	yield;
	MainShotFire;
	Options;
	BombEffect;
	th10_System;
}


task Options{
	let posx=[-42,-14, 14, 42];
	let posy=[-30,-36,-36,-30];
	let stop=false;
	let wait=false;
	let color=0;
	let scale=1;
	let fireM=false;
	let fireS=false;
	let gang=0;
	let cenx=GetPlayerX;
	let ceny=GetPlayerY;
	let scalex=1;
	let scaley=1;
	let dscale=0.05;
	let alpha=255;
	let dalpha=16;
	
	Move;
	CreateOptions;
	Stop;
	ShotControl;
	ScaleControl;
	VanishControl;
	ColorControl;
	
	
	function CreateOptions{
		ascent(n in 0..4){Option(n,0,0,false);}
	}
	
	
	task Move{
		let ang;
		let distance;
		loop{
			if(OnMissed && !OnBorderOfLife){
				loop(20){yield;}
				while(OnMissed){
					cenx=GetPlayerX;
					ceny=GetPlayerY;
					yield;
				}
				if(GetKeyState(VK_SLOWMOVE)==KEY_FREE){
					cenx=GetPlayerX;
					ceny=GetPlayerY;
				}
			}else{
				if(!stop){
					ang=atan2(GetPlayerY-ceny,GetPlayerX-cenx);
					distance=((GetPlayerX-cenx)^2+(GetPlayerY-ceny)^2)^0.5;
					distance*=0.2929;
					if(distance<1){
						cenx=GetPlayerX;
						ceny=GetPlayerY;
					}else{
						cenx+=distance*cos(ang);
						ceny+=distance*sin(ang);
					}
				}
			}
			yield;
		}
	}
	
	
	task Stop{
		let c=0;
		loop{
			if(!OnMissed || OnBorderOfLife){
				if(GetKeyState(VK_SLOWMOVE)==KEY_FREE){
					if(c>0){
						wait=true;
						c--;
					}else{
						wait=false;
					}
				}else{
					wait=false;
					c=30;
				}
				if(c==0){
					stop=false;
				}else{
					stop=true;
				}
			}
			yield;
		}
	}
	
	
	task ShotControl{
		MainShot;
		SubShot;
		
		task MainShot{
			let c=0;
			loop{
				if((GetKeyState(VK_SHOT)==KEY_PUSH)||(GetKeyState(VK_SHOT)==KEY_HOLD)){
					c=6;
				}
				
				if(c>0){
					fireM=true;
					c--;
					yield;
					fireM=false;
					yield;
				}
				yield;
			}
		}
		
		task SubShot{
			loop{
				if(GetKeyState(VK_SLOWMOVE)==KEY_FREE&&GetKeyState(VK_SHOT)){
					fireS=true;
					yield;
					fireS=false;
					loop(14){yield;}
				}
				yield;
			}
		}
	}
	
	
	task ScaleControl{
		let ang=0;
		loop{
			if(wait){
				yield;
			}else{
				if(GetKeyState(VK_SLOWMOVE)){
					loop(20){
						scale=1+0.2*sin(ang);
						ang+=18;
						yield;
					}
				}else{
					loop(30){
						scale=0.875+0.125*sin(ang);
						ang+=12;
						yield;
					}
				}
				ang%=360;
			}
		}
	}
	
	
	task VanishControl{
		loop{
			if(OnMissed && !OnBorderOfLife){
				if(scalex>0){
					scalex-=dscale;
					scaley+=dscale;
				}
				if(alpha>0){
					alpha-=dalpha;
				}
			}else{
				scalex=1;
				scaley=1;
				alpha=255;
			}
			yield;
		}
	}
	
	
	task ColorControl{
		let c=0;
		loop{
			if(wait){
				color=(floor(c/2)%2);
			}else{
				if(GetKeyState(VK_SLOWMOVE)){
					color=1;
				}else{
					color=0;
				}
			}
			gang+=7.5;
			gang%=360;
			c++;
			yield;
		}
	}
	
	
	task Option(num,x,y,flag){
		let obje=Obj_Create(OBJ_EFFECT);
		let obj=Obj_Create(OBJ_EFFECT);
		
		let timer=10800;
		
		ObjEffect_SetTexture(obj,IMG_OPTION);
		ObjEffect_SetLayer(obj,2);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetVertexXY(obj,0,-7.5,-7.5);
		ObjEffect_SetVertexXY(obj,1,-7.5,8.5);
		ObjEffect_SetVertexXY(obj,2,8.5,-7.5);
		ObjEffect_SetVertexXY(obj,3,8.5,8.5);
		
		ObjEffect_SetTexture(obje,IMG_OPTION);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_SetRenderState(obje,ALPHA);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,32,16);
		ObjEffect_SetVertexUV(obje,1,32,32);
		ObjEffect_SetVertexUV(obje,2,48,16);
		ObjEffect_SetVertexUV(obje,3,48,32);
		ObjEffect_SetVertexXY(obje,0,-10.5,-10.5);
		ObjEffect_SetVertexXY(obje,1,-10.5,11.5);
		ObjEffect_SetVertexXY(obje,2,11.5,-10.5);
		ObjEffect_SetVertexXY(obje,3,11.5,11.5);
		
		if(!flag){
			Obj_SetPosition(obj,cenx+posx[num],ceny+posy[num]);
			Obj_SetPosition(obje,cenx+posx[num],ceny+posy[num]);
		}else{
			Obj_SetPosition(obj,x,y);
			Obj_SetPosition(obje,x,y);
		}
		
		while(!Obj_BeDeleted(obj)){
			alternative(color)
			case(0){
				ObjEffect_SetVertexUV(obj,0,32,0);
				ObjEffect_SetVertexUV(obj,1,32,16);
				ObjEffect_SetVertexUV(obj,2,48,0);
				ObjEffect_SetVertexUV(obj,3,48,16);
			}
			case(1){
				ObjEffect_SetVertexUV(obj,0,48,0);
				ObjEffect_SetVertexUV(obj,1,48,16);
				ObjEffect_SetVertexUV(obj,2,64,0);
				ObjEffect_SetVertexUV(obj,3,64,16);
			}
			
			
			if(OnMissed && !OnBorderOfLife){
				ObjEffect_SetRenderState(obj,ADD);
				ObjEffect_SetScale(obj,scalex,scaley);
			}else{
				ObjEffect_SetRenderState(obj,ALPHA);
				ObjEffect_SetScale(obj,scale,scale);
			}
			ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			
			if(!stop || (OnMissed && !OnBorderOfLife)){
				Obj_SetPosition(obj,cenx+posx[num],ceny+posy[num]);
				Obj_SetPosition(obje,cenx+posx[num],ceny+posy[num]);
			}
			
			if(!OnMissed && !OnEvent){
				if(fireM){
					if((num==1)||(num==2)){
						MainShot(Obj_GetX(obj),Obj_GetY(obj),DMG_SUBSHOT1[1]);
					}else{
						MainShot(Obj_GetX(obj),Obj_GetY(obj),DMG_SUBSHOT1[0]);
					}
				}
				if(fireS){
					SubShot(Obj_GetX(obj),Obj_GetY(obj));
				}
			}
			
			ObjEffect_SetAngle(obje,0,0,-gang);
			
			timer--;
			
			if(timer==0){
				Option(num,Obj_GetX(obj),Obj_GetY(obj),true);
				Obj_Delete(obj);
				Obj_Delete(obje);
				return;
			}
			yield;
		}
	}
	
	
	task MainShot(x,y,dmg){
		let obj=Obj_Create(OBJ_SHOT);
		let ang=0;
		let dang=15;
		let scale=1;
		let dscale=0.03;
		let alpha=32;
		let dalpha=3.2;
		let c=0;
		Obj_SetPosition(obj,x,y);
		Obj_SetSpeed(obj,5.6);
		Obj_SetAngle(obj,270);
		ObjShot_SetGraphic(obj,2);
		ObjShot_SetDamage(obj,dmg);
		ObjShot_SetPenetration(obj,1);
		
		let obje=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obje,IMG_SHOT);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_SetRenderState(obje,ADD);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,96,0);
		ObjEffect_SetVertexUV(obje,1,96,32);
		ObjEffect_SetVertexUV(obje,2,128,0);
		ObjEffect_SetVertexUV(obje,3,128,32);
		ObjEffect_SetVertexXY(obje,0,-10,-10);
		ObjEffect_SetVertexXY(obje,1,-10,10);
		ObjEffect_SetVertexXY(obje,2,10,-10);
		ObjEffect_SetVertexXY(obje,3,10,10);
		ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
		while(!Obj_BeDeleted(obj)){
			ang+=dang;
			ObjEffect_SetAngle(obje,0,0,ang);
			scale+=dscale;
			ObjEffect_SetScale(obje,scale,scale);
			if(c>=20){
				alpha-=dalpha;
				ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			}
			Obj_SetPosition(obje,Obj_GetX(obj),Obj_GetY(obj));
			c++;
			if(c>=30){Obj_Delete(obj);}
			yield;
		}
		
		if(c<30){
			ObjEffect_SetScale(obje,2,2);
			loop(3){
				ang+=dang;
				ObjEffect_SetAngle(obje,0,0,ang);
				yield;
				alpha/=2;
				ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			}
		}
		Obj_Delete(obje);
	}
	
	
	task SubShot(x,y){
		let obj=Obj_Create(OBJ_SHOT);
		Obj_SetPosition(obj,x,y);
		Obj_SetSpeed(obj,6);
		Obj_SetAngle(obj,270);
		ObjShot_SetGraphic(obj,1);
		ObjShot_SetDamage(obj,DMG_SUBSHOT2);
		ObjShot_SetPenetration(obj,1);
		
		let obje=Obj_Create(OBJ_EFFECT);
		let alpha=64;
		let dalpha=3.2;
		let flg=false;
		ObjEffect_SetTexture(obje,IMG_SHOT);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,16,0);
		ObjEffect_SetVertexUV(obje,1,16,32);
		ObjEffect_SetVertexUV(obje,2,32,0);
		ObjEffect_SetVertexUV(obje,3,32,32);
		ObjEffect_SetVertexXY(obje,0,-8,-16);
		ObjEffect_SetVertexXY(obje,1,-8,16);
		ObjEffect_SetVertexXY(obje,2,8,-16);
		ObjEffect_SetVertexXY(obje,3,8,16);
		while(!Obj_BeDeleted(obj)){
			x=Obj_GetX(obj);
			y=Obj_GetY(obj);
			Obj_SetPosition(obje,x,y);
			flg=Obj_IsIntersected(obj);
			yield;
		}
		
		if(!flg){
			Obj_Delete(obje);
			return;
		}
		
		ObjEffect_SetRenderState(obje,ADD);
		ObjEffect_SetVertexUV(obje,0,16,32);
		ObjEffect_SetVertexUV(obje,1,16,64);
		ObjEffect_SetVertexUV(obje,2,32,32);
		ObjEffect_SetVertexUV(obje,3,32,64);
		loop(20){
			Obj_SetPosition(obje,x,y);
			y-=4;
			ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			alpha-=dalpha;
			yield;
		}
		Obj_Delete(obje);
	}
}